import { config } from "../config/index"; //全局配置
/**
 * name:wsAPI.js
 * 功能: 封装了微信小程序所有的API,单独处理了wx.request和上传文件
 */

//#region wx所有API通用封装
let nullFn = () => {
};

//#region 如果传入的微信API错误，发出提示
function IllegalAPIException(name) {
  this.message = "没有这样的API [" + name + "]";
  this.name = '非法的APIException';
}
//#endregion

//#region 服务封装
let services = {
  sleep: (time) => {
    return new Promise(function (resolve, reject) {
      setTimeout(resolve, time);
    })
  },
  stop: () => {
    return new Promise(function (resolve, reject) {
    })
  },
  taskSequence: () => {
    return new Promise(function (resolve, reject) {
      resolve()
    })
  }
};
//#endregion

//#region 小程序接口封装
let wsAPI = new Proxy(services, {
  get: function (target, property) {
    if (property in target) {
      return target[property];
    } else if (property in wx) {
      return (obj) => {
        return new Promise(function (resolve, reject) {
          obj = obj || {};
          obj.success = (...args) => {
            resolve(...args)
          };
          obj.fail = (...args) => {
            reject(...args);
          };
          obj.complete = nullFn;
          wx[property](obj);
        });
      }
    } else {
      throw new IllegalAPIException(property);
    }
  }
});
//#endregion
//#endregion

//#region wx.request单独封装
function wxrequest(url, params = {}, method = 'POST') {
  return new Promise((resolve, reject) => {
    wx.request({
      url: `${config.apiurl}${url}`,
      data: params,
      header: {
        'Content-Type': 'application/json', // 内容类型（常见值）
        'Authotokrization': wx.getStorageSync('token') // 自定义认证头
        //'X-Custom-Header': 'custom-value' // 其他自定义头
      },
      method: method,
      success: (res) => {
        if (res.statusCode === 200) {
          resolve(res.data);
        } else {
          reject(new Error(`请求失败，状态码: ${res.statusCode}`));
        }
      },
      fail: (err) => {
        //console.error('请求错误:', err);
        reject(new Error(`请求错误: ${err.errMsg}`));
      }
    })
  })
}
//#endregion

//#region wx.uploadFile单独处理开始
//选择文件
function chooseMedia(_count) {
  return new Promise((resolve, reject) => wx.chooseMedia({
    sizeType: ['compressed'],//sizeType可取值:original原图,compressed压缩图,如果要让用户选择可设置为数组['original', 'compressed']
    count: _count,//最多可以选择的图片张数
    success: resolve,
    fail: reject
  })
  )
}
//上传文件
//参数1：_path上传后的文件保存在服务器端的文件夹名称或路径，比如/abc/d
//参数2：_tempFilePaths选择文件成功后本地文件临时路径
//返回：服务端的响应信息
function uploadFileBase(_path, _tempFilePaths) {
  //console.log('服务端保存路径', _path);
  //console.log('本地文件临时路径', _tempFilePaths);
  //console.log('上传API路径', config.uploadfileapiurl);
  //参数1：path文件保存在对象存储空间的路径，必须
  //参数2：fileName文件名，非必须，不传递服务端接口自动命名
  //参数3：withdatetimepath文件保存路径是否带日期文件夹
  const _url = `${config.uploadfileapiurl}?path=${config.uploadfilebasepath}/${_path}&withdatetimepath=false`;
  //console.log('上传API路径', _url);
  return new Promise((resolve, reject) => wx.uploadFile({
    url: _url,//上传文件服务端API地址和路径
    //_tempFilePaths可以作为img标签的src属性显示图片，图片的本地临时文件路径列表tempFilePaths	Array.<string>或者图片的本地临时文件路径列表tempFiles	Array.<Object>图片的本地临时文件列表
    filePath: _tempFilePaths,
    name: 'file',
    header: { 'content-type': 'multipart/form-data' },
    success: res => {
      //服务器返回数据
      resolve(res.data);
    },
    fail: error => {
      console.error("上传文件错误", error)
      reject(error);
    }
  }))
}

const uploadFile = ({
  //单文件上传
  //调用示例：
  // uploadFile.uploadFileSingle("image")
  // .then(res => {
  //     if (res.statusCode == 200) {
  //       let _filepath = JSON.parse(res.data).filepath; //上传文件返回路径
  //     }
  //   });
  //参数1：_path上传后的文件保存在服务器端的文件夹名称或路径，比如/abc/d
  //返回：服务端的响应信息
  uploadFileSingle: function (_path) {
    return chooseMedia(1)
      .then(res => uploadFileBase(_path, res.tempFilePaths[0])
      )
  }
  ,
  //多文件上传
  //调用示例：
  // uploadFile.uploadFileMultiple("image")
  // .then(res => {
  //   for (let i = 0; i < res.length; i++) {
  //     if (res[i].statusCode == 200) {
  //       //console.log('上传文件路径', res[i]);
  //       let _filepath = JSON.parse(res[i].data).filepath; //上传文件返回路径      
  //       let _tempPhotoPath = new Array(_filepath);//当前路径声明新数组
  //       原有数组.push.apply(_PhotosArray, _tempPhotoPath); //合并数组
  //     }
  //   }
  //   });
  //参数1：_path上传后的文件保存在服务器端的文件夹名称或路径，比如/abc/d
  //返回：服务端的响应信息
  uploadFileMultiple: function (_path) {
    return chooseMedia(18)
      .then(res => {
        let list = res.tempFilePaths;
        // 生成一个Promise对象的数组
        var promises = list.map(function (item) {
          return uploadFileBase(_path, item);;
        });

        return Promise.all(promises).then(function (res) {
          //console.log(res);     
          return new Promise((reslove, reject) => {
            reslove(res)
          })
        })

      })
  },
  //剪裁后文件上传，因为要剪裁，只支持单文件上传
  // 调用示例：
  // let _SetValueObject = 'userInfo.BackgroundImg'; //图片剪裁后要赋值的对象，本页面中的变量或组件
  // let _scale = 9 / 5; //剪裁比例，宽除以高，可以是分数，示例值：16/9，如果为1表示是正方形
  // wx.navigateTo({
  //   url: '/pages/cropperupload/index?_SetValueObject=' + _SetValueObject + '&scale=' + _scale
  // });
  //参数1：_path上传后的文件保存在服务器端的文件夹名称或路径，比如"/abc/d"或者"image"
  //参数2：_tmpcorpperimgpath为剪裁后返回的临时路径
  //返回：服务端的响应信息
  corpperuploadFile: function (_path, _tmpcorpperimgpath) {
    return uploadFileBase(_path, _tmpcorpperimgpath);
  },
  //上传视频
  //调用示例：
  // uploadFile.uploadVideo("image")
  // .then(res => {
  //     if (res.statusCode == 200) {
  //       let _filepath = JSON.parse(res.data).filepath; //上传文件返回路径
  //     }
  //   });
  //参数1：_path上传后的文件保存在服务器端的文件夹名称或路径，比如/abc/d
  //返回：服务端的响应信息
  uploadVideo: function (_path) {
    return new Promise((resolve, reject) =>
      wx.chooseMedia({
        sourceType: ['album'],
        maxDuration: 30,
        success: resolve,
        fail: reject
      })
    )
      // .then(res => uploadFileBase(_path, res.tempFilePath));
      .then(res => {
        let tempFilesSize = res.size;//获取文件的大小，单位B
        //1048576=1024*1024*10=10M
        if (tempFilesSize > 10485760) {
          console.log('视频文件大小', tempFilesSize);
          return { statusCode: 1000 };
        }
        else {
          return uploadFileBase(_path, res.tempFilePath);
        }
      });
  }
});
//#endregion 

//#region 数组帮助类
const arrayHelper =
  ({
    //json对象转数组
    //调用示例：
    //let _newArr = arrayHelper.json2array(jsonobj);
    json2array: function (jsonobj) {
      var newArr = [];
      for (var i in jsonobj) {
        newArr.push(jsonobj[i]);
      }
      return newArr;
    },
    //在数组中查找指定元素并返回索引位置,参数:arr数组,item需要判断的数组项对象
    //调用示例：
    //let 数组项 = 数组对象.find(element => (element.属性 == 数组元素值));
    //let _arritemindex = arrayHelper.arrindex(数组项);
    arrindex: function (arr, item) {
      if (Array.prototype.indexOf) {
        return arr.indexOf(item);
      }
      else {
        for (var i = 0; i < arr.length; i++) {
          if (arr[i] == item) {
            return i;
          }
        }
      }
      return -1;
    },
    //unshift() 方法可向数组的开头添加一个或更多元素，并返回新的长度    
    //arrayObject.unshift(newelement1,newelement2,....,newelementX);
    //参数:
    //newelement1必需,向数组添加的第一个元素
    //newelement2可选,向数组添加的第二个元素
    //newelementX可选,可添加若干个元素        
    arrunshift: function (oldArray, newelement) {
      return oldArray.unshift(newelement);
    },
    //push()方法可向数组的尾部添加一个或更多元素，并返回新的长度
    //arrayObject.push.apply(newelement1,newelement2,....,newelementX);
    //参数:
    //newelement1必需,向数组添加的第一个元素
    //newelement2可选,向数组添加的第二个元素
    //newelementX可选,可添加若干个元素
    arrpush: function (oldArray, newelement) {
      return oldArray.push.apply(oldArray, newelement);
    },
    //splice()方法删除数组指定项，返回新数组
    //参数:
    //oldArray,原数组
    //index,索引
    //count,删除个数
    //arrayObject.splice(index,count);
    arrsplice: function (oldArray, index, count) {
      return oldArray.splice(index, count);
    }

    // 按条件过滤
    //var result = _imageslist.filter(function (item) { return item.Id != _item.Id });
  });
//#endregion 


//#region 轮播图广告
const swiperHelper =
  ({
    swiperlist: function (domainUrl, categoryId) {
      let _url = domainUrl + '/Api/Carousel/List';
      let _data = { CategoryId: categoryId };
      return requstPost(_url, _data);
    }
  });
//#endregion 

//--------------------------------------------------------------------------------------------
//json时间对象的格式化;
function jsonDateFormat(jsonDate, formatstr) {
  //json日期格式转换为正常格式
  var date = new Date(parseInt(jsonDate.replace("/Date(", "").replace(")/", ""), 10));
  return date.format(formatstr);
}

/*
* 时间对象的格式化;
*/
Date.prototype.format = function (format) {
  /*
  * eg:format="yyyy-MM-dd hh:mm:ss";
  */
  var o = {
    "M+": this.getMonth() + 1, //month
    "d+": this.getDate(),   //day
    "h+": this.getHours(),  //hour
    "m+": this.getMinutes(), //minute
    "s+": this.getSeconds(), //second
    "q+": Math.floor((this.getMonth() + 3) / 3), //quarter
    "S": this.getMilliseconds() //millisecond
  }

  if (/(y+)/.test(format)) {
    format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  }

  for (var k in o) {
    if (new RegExp("(" + k + ")").test(format)) {
      format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
    }
  }
  return format;
}
/*
*调用方法
var times = 1290371638000;
var testDate = new Date(times);
var testStr = testDate.format("yyyy年MM月dd日hh小时mm分ss秒");
var testStr2 = testDate.format("yyyy-MM-dd");
*/
//--------------------------------------------------------------------------------------------
//发布的接口
module.exports = {
  wsAPI//封装所有微信小程序api
  , wxrequest//wx.request请求
  , uploadFile//上传文件
  , arrayHelper//数组帮助类
  , swiperHelper//轮播图
  , jsonDateFormat//Json日期格式化
}

/*调用示例
在需要调用的js中引入，{}中为需要的模块，比如｛wsAPI,uploadFile,post｝
import { 需要的模块 } from "../../utils/wsAPI";
调用：如果没有 taskSequence，第一个promise就和下面的不对齐
wsAPI.taskSequence()
        .then(() => wsAPI.login())
        .then(() => wsAPI.showLoading({title: "保存中"}))
        .then(res => console.log('用户登录信息', res))
        .then(() => wsAPI.hideLoading())
        .then(() => wxpost(_url, _data))
        .then(() => wsAPI.showModal({title: "保存", content: "确定保存？"}))
        .then(res => {
            if (!res.confirm) {
                return wsAPI.stop();
            }
        })
        .then(() => wsAPI.sleep(500))
        .then(() => wsAPI.showLoading({title: "保存中"}))
        .then(res => console.log('post请求返回信息', res))
        .then(() => wsAPI.hideLoading())
        .then(() => console.log("done"));
*/